package com.example.springboot.web;


import com.example.springboot.mapper.TestMapper;
import com.google.gson.Gson;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.Hashtable;


//每次浏览器连接上来  都会创建一个新的TalkServer对象， 坑
//第一个对象 是spring 创建的  后面的都是websocket创建的
//因此 后面创建的对参 没有注入bean
//因此 不能用@Resource注解注入bean
@ServerEndpoint("/talk/{id}")
@Component
public class TalkServer {

    //存放所有在线用户的集合
   static Hashtable<String,Session> sessions = new Hashtable<>();



   //spring不能对静态属性注入，所以只能通过set方法注入
   static  TestMapper testMapper;


   @Resource
   public void setTestMapper(TestMapper testMapper){
        this.testMapper = testMapper;
   }

    @OnOpen
    public void onOpen(Session session,@PathParam("id") String id) {

        //给当前用户发送已上线的用户消息
        sessions.values().forEach(s->{
            send(session,new Msg(
                    ""+s.getUserProperties().get("id"),
                    null,id,"上线了"));
        });


        //查询用户信息
        //明明已经注入 但是仍然为空
        testMapper.selectAllAccount();

        sessions.put(id,session);
        //将id保存到会话
        session.getUserProperties().put("id",id);

        sessions.values().forEach(s->{
            send(s,new Msg(id,null,id,"上线了"));
        });
    }


    @OnClose
    public void onClose(Session session ) {
        String id = (String) session.getUserProperties().get("id");
        sessions.remove(id);
        sessions.values().forEach(s->{
            send(s,new Msg(null,id,id,"下线了"));
        });

    }


    //接受到用户发送的消息 =》 群发
    @OnMessage
    public void onMessage(Session session,String message ) {
        //全部用户群发
        sessions.values().forEach(s->{

            send(s,new Msg(null,null,
                    (String) session.getUserProperties().get("id"),message));
        });


        //私聊  TODO


        //自定义群发  TODO

    }


    Gson gson = new Gson();
    //给指定的客户端发送消息
    public void send(Session session,Object obj){
        String json = gson.toJson(obj);
        try {
            session.getBasicRemote().sendText(json);
        } catch (IOException e) {
             e.printStackTrace();
        }
    }



    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    class Msg{
        String onlineUser; //在线用户
        String downlineUser; //下线用户
        String sendUser; //发送消息的用户

        String sendMsg ; //消息内容
    }

}
